/**
 * 扁平化数据加工成树形数据
 *  - forEachBeforeHandle如果需要跳过此轮forEach循环, 需要抛出一个错误.
 */
exports.flatToTree = ({
	dataArr, // 源数据
	forEachBeforeHandle, // 在遍历每一项节点时, 都会调用此回调,并传入该节点的参数, 如果需要跳过此轮forEach循环, 则需要抛出一个错误.
	isSort = true, // 是否排序_只能通过sort属性来排序
	fatherId = "pid", // 在节点中, 通过哪个属性来寻找父节点
	localId = "_id",
	childrenKey = "children", // 将子节点插入到哪个属性下_可以自定义
	didnFindPidIsInsertRoot = false, // 没有找到父节点时, 是否插入到根节点
}) => {
	// 先进行排序
	if (isSort) dataArr.sort((a, b) => a.sort - b.sort);

	// 哈希表
	const map = new Map();
	dataArr.forEach((item) => map.set(item[localId].toString(), { ...item, [childrenKey]: [] }));

	// 树形数组
	const tree = [];

	// 遍历数据, 生成树形结构
	dataArr.forEach((item) => {
		try {
			if (forEachBeforeHandle) forEachBeforeHandle(item);
		} catch (e) {
			return;
		}

		// 路由权限处理
		if (item.pid === undefined) {
			tree.push(map.get(item[localId].toString()));
		} else {
			// 则找到它的父节点, 并添加到父节点中
			const parent = map.get(item[fatherId].toString());
			// 如果找不到父节点
			if (!parent) {
				// 如果 didnFindPidIsInsertRoot:true 则会插入根节点
				if (didnFindPidIsInsertRoot) tree.push(map.get(item[localId].toString()));
			} else {
				parent[childrenKey].push(map.get(item[localId].toString()));
			}
		}
	});

	return tree;
};

/**
 * 树形数据加工成扁平化数据
 */
exports.treeToFlat = (dataArr) => {};
